﻿
#ifndef SELF_MODULE_ID
#define SELF_MODULE_ID

#ifdef WIN32
#include <tchar.h>
#include <strsafe.h>
#pragma comment(lib, "strsafe.lib") 
#endif
#include "PublicMacro.h"			// add by cxf
//#include "EasyDataTime.h"

#pragma pack(push,1)


#define TIMER_ID_TEST_01 1
#define TIMER_ID_TEST_02 2

// 定时器ID
#define TIMER_ID_GET_FEATS_LIST		100		// 功勋列表
#define TIMER_ID_GET_MATCH_LIST		101		// 比赛列表
#define TIMER_ID_GENERATE_RANKING	102		// 生成排名
#define TIMER_ID_GET_GAME_ROOM_INFO	103		// 获取游戏和房间
/*#define TIMER_ID_GET_VERSION		104		// 版本号*/

// 定时器时间 generate
#define TIMER_TIME_GET_FEATS_LIST	(60*1000)*60	// 获取功勋时间
#define TIMER_TIME_GET_MATCH_LIST	(60*1000)*60	// 获取比赛时间
#define TIMER_TIME_GENERATE_RANKING	(60*1000)*60	// 获取比赛时间
#define TIMER_TIME_GET_GAME_ROOM_INFO (60*1000)*10	// 获取游戏和房间时间
/*#define TIMER_TIME_GET_VERSION		(60*1000)*5		// 获取游戏版本号*/

#define MAIN_TEST_USER_INFO		10	// 模拟申请用户信息
#define SUB_TEST_USER_INFO_01  101	// 显示用户信息	
#define SUB_TEST_USER_INFO_02  102	// 不显示用户信息
#define SUB_HALL_LOGIN		   103	// 大厅登陆
#define SUB_CLOSE_PEER  110			// 关闭对方	

#define MAIN_TEST_INTENSIVE     15	// 系统密集测试用
#define SUB_TEST_INTENSIVE_01 1001	// 密集测试，不处理就直接回发给对端
#define SUB_TEST_INTENSIVE_02 1003	// 密集测试，简单处理后就直接回发给对端

#define MAIN_TEST_DB  20				// 测试数据库
#define SUB_TEST_DB_EASY					200 // 数据库简易测试
#define SUB_TEST_DB_INTENSIVE				201	// 密集测试数据库
#define SUB_TEST_DB_COMPREHENSIVE			202	// 综合测试数据库
#define SUB_TEST_REQUEST_USER_LIST			301	// 申请用户列表
#define SUB_TEST_REQUEST_USER_LIST_OVER		302	// 用户列表结束

#define MAIN_TEST_FIRST_ARRIVE_LAST_GO   22			// 后发先至
#define SUB_TEST_FIRST_ARRIVE_LAST_GO_1	101			// 后发先至
#define SUB_TEST_FIRST_ARRIVE_LAST_GO_2	102			// 后发先至

#define MAIN_TEST_IMMEDIATELY_CUT		25	// 收到包立刻断开


/*
**author : add by cxf
**description:
******CS  -> 客户端发往服务器的
******SC  -> 服务器发往客户端的
******CSG -> 客户端/服务器互用
******MAIN_MSG -> 主消息
******SUB -> 子消息
*/
#define MAIN_MSG_LOGIN						2000		// 用户登录主消息
#define SUB_CS_USER_LOGIN					2101		// 用户登录子消息
#define SUB_SC_USER_LOGIN_SUC				2102		// 用户登录成功
#define SUB_SC_USER_LOGIN_FINISH			2103		// 用户登录完成
#define SUB_SC_GAME_LIST					2104		// 游戏列表
#define SUB_SC_USER_LOGIN_FAIL				2105		// 用户登录失败
#define SUB_SC_EXTEND_DATA					2106		// 用户登陆扩展数据（特殊游戏使用）
#define SUB_CS_USER_LOGIN_SELECT_GAME_SRV		 2107      // 用户登录 选择房间服务器
#define SUB_SC_USER_LOGIN_SELECT_GAME_SRV_SUC    2108      // 用户登录 选择房间服务器 成功
#define SUB_SC_USER_LOGIN_SELECT_GAME_SRV_FINISH 2109      // 用户登录 选择房间服务器 完成
#define SUB_CS_USER_LOGIN_SELECT_GAME_SRV_FAIL   2110      // 用户登录 选择房间服务器 失败

#define SUB_CSG_GAME_ROOM_LIST				2015		// 房间列表
#define SUB_SC_GAME_ROOM_LIST_SEDN_FINISH	2016		// 房间列表发送完成
#define SUB_CSG_PLAZA_LIST					2017		// 大厅列表
#define SUB_SG_VERSION_REEOR				2018		// 版本错误
#define SUB_CSG_SELECT_GAME_SRV_LIST		2019		//选择房间服务器 列表

#define SUB_CS_USER_REGISTER				2120		// 用户注册
#define SUB_SC_USER_REGISTER_FINISH			2121		// 用户注册成功

#define MAIN_MSG_SYS						3000		// 系统主消息（比如登录时个公告等等）
#define SUB_SS_GET_VERSION					3001		// 游戏版本号
#define SUB_SS_GET_IS_AGENT					3002		// 获取推荐人注册开关
#define SUB_CSG_CONTACT_INFORMATION         3003        //与官方的联系方式

#define MAIN_MSG_RANKING					4000		// 用户排名
#define SUB_CSG_GET_FEATS_RANKING			4001		// 获取功勋排名
#define SUB_SC_GET_FEATS_RANKING_FINISH		4002		// 获取功勋排名完成
#define SUB_CS_UPD_USER_FEATS_RANKING		4003		// 领取用户功勋排名奖励
#define SUB_SC_UPD_USER_FEATS_RANKING_SUC	4004		// 领取用户功勋排名奖励成功
#define SUB_SC_UPD_USER_FEATS_RANKING_ERR	4005		// 领取用户功勋排名奖励失败
#define SUB_CSG_GET_MATCH_RANKING			4006		// 获取比赛排名
#define SUB_SC_GET_MATCH_RANKING_FINISH		4007		// 获取比赛排名完成
#define SUB_CS_UPD_USER_MATCH_RANKING		4008		// 领取用户比赛排名奖励
#define SUB_SC_UPD_USER_MATCH_RANKING_SUC	4009		// 领取用户比赛排名奖励成功
#define SUB_SC_UPD_USER_MATCH_RANKING_ERR	4010		// 领取用户比赛排名奖励失败


// 所有登录服操作
#define	RET_LOGIN_OPERATE_SUCCEED			0			// 操作成功
// 登录
#define	RET_USER_NOT_EXIST					10			// 用户名或密码错误
#define	RET_FORBID_ENTER_TIME				11			// 用户被禁止登录
// 注册
#define	RET_USER_NAME_EXIST					20			// 帐号已经存在
#define RET_USER_NAME_IS_EMPTY				21			// 用户名为空
#define	RET_USER_NICKNAME_EXIST				30			// 昵称已经存在
// 领取奖励
#define RET_RANKING_NOT_CURRENT_USER		40			// 不能领取别人奖励
#define RET_RANKING_IS_GET					50			// 奖励已经领取过了
#define RET_RANKING_SEND_ID_NOT_EXIST		60			// 名次ID不存在

// 用户登录
struct CMD_CS_UserLogin
{
	CMD_CS_UserLogin()
	{
		memset(this,0,sizeof(*this));
	}
	int			iVersion;								// 版本号
	int			iAppId;									// 游戏AppID(捕鱼=1; 三公=2; 估计牛牛是=5;)
	char		szName[USER_NAME_LEN];					// 帐号
	char		szPwd[USER_PASSWORD_LEN];				// 密码
	char		szIp[IP_ADDRES_LEN];					// IP地址(服务器用)
	int			iTrenchId;								// 渠道【推广公司：比如腾讯，360，安桌市场等等】(0:本公司; )渠道增加把注释也加上。
	int			iPlatformNo;							// 1=手机;2=PC;3=网页;
	char		szMachineCode[MACHINE_CODE_LEN];		// 机器序列号
	char        szCellPhone[STR_20_LEN];                // 手机电话
	
	char		szData[48];								// 保留48个字节
};

// 版本错误
struct CMD_VerError
{
	CMD_VerError()
	{
		memset(this,0,sizeof(*this));
	}
	int			iVersion;									// 版本号
	char szPCDownAddr[STR_100_LEN]; //pc 下载地址
	char szAndrDownAddr[STR_100_LEN]; //android 下载地址
	char szAppDownAddr[STR_100_LEN]; //ios 下载地址 
	char szPacketName[GAME_NAME_LEN];		// 包名
};

// 是否开启代理人注册功能
struct CMD_IsAgent
{
	CMD_IsAgent()
	{
		memset(this,0,sizeof(*this));
	}
	int			iIsAgent;									// 是否开启代理人注册功能
};
// 登录错误
struct CMD_SC_UserLoginFail
{
	CMD_SC_UserLoginFail()
	{
		memset(this,0,sizeof(*this));
	}
	int				iRet;								// 返回状态(0:成功;!0:失败)
	char			szResText[RESULT_TEXT_LEN];			// 返回内容说明
};

// 用户登录成功
struct CMD_SC_UserLoginInfo
{
	CMD_SC_UserLoginInfo()
	{
		memset(this, 0, sizeof(*this));
		iRet = -1;
	}
	int				iRet;								// 返回状态(0:成功;1:)
	LONGLONG		llUserID;							// 用户ID
	LONGLONG		llGold;								// 金币
	LONGLONG		llExperienceGold;					// 体验币
	LONGLONG		llPoint;							// 积分
	char			szName[USER_NAME_LEN];				// 帐号
	char			szNickName[USER_NAME_LEN];			// 用户呢称
	int				iSex;								// 性别
	LONGLONG		lSysLogoID;							// 头像ID
	LONGLONG		lExperience;						// 经验值
	int				iWinCount;							// 赢总数
	int				iLostCount;							// 输总数
	long long		lRevenue;							// 收税
	char			szIdCardNo[USER_IDENTITY_CARD_LEN];	// 身份证号码
	char			szIdCardName[USER_REAL_NAME_LEN];	// 身份证名字
	EASY_DATA_TIME	dtForbidEnterTime;					// 禁止进入时间
	int				iMaxWinGold;						// 最大赢取金币
	long long		lMaxCardData;						// 最大牌型数据
	int				iAgentId;							// 代理ID(6位数字)
	char        szCellPhone[STR_20_LEN];                // 手机电话
	char			szResText[RESULT_TEXT_LEN];			// 返回内容说明
	int				nRecommendCode;						// 推荐码
};

// 捕鱼特殊用户数据
struct CMD_fishUserLoginInfo
{
	CMD_fishUserLoginInfo(){
		memset(this, 0, sizeof(CMD_fishUserLoginInfo));
		memset(szSignature, 0, sizeof(szSignature));
		memset(szFavorite, 0, sizeof(szFavorite));
		memset(szExplain, 0, sizeof(szExplain));
	}
	int iRet;											// 返回状态(0:成功;1:)
	long long llAgentID;								// 绑定人ID
	long long llDiamond;								// 钻石
	long long llOxygen;									// 氧气
	long long llBuildValue;								// 建设值
	long long llPearl;									// 珍珠
	char szSignature[USER_SIGNATURE];					// 个人签名
	char szFavorite[USER_FAVORITE];						// 兴趣爱好
	char szExplain[USER_EXPLAIN];						// 个人说明
};

// 游戏信息
struct CMD_SC_GAME_LIST
{
	CMD_SC_GAME_LIST()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iRet;								// 返回值
	int				iID;								// 游戏ID
	char			szGameName[GAME_NAME_LEN];			// 游戏名字
	char			szProgressName[PROGRESS_NAME_LEN];	// 游戏进程名字长度
	int				iGameType;							// 游戏类型
	int				iSortVal;							// 排序
};

// 功勋信息
struct CMD_SC_FEATS_LIST
{
	CMD_SC_FEATS_LIST()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iSortId;								// 列表ID
	int				iID;									// ID
	long long		lUserID;								// 用户ID
	char			szNickName[USER_NAME_LEN];				// 用户呢称
	int				iRankingCode;							// 排名编码
	int				iRankingNo;								// 排名
	int				iFeats;									// 功勋
	int				iRewardGold;							// 奖励金币
	int				iIsGet;									// 是否已经领取
};

// 信息
struct CMD_SC_MATCH_LIST
{
	CMD_SC_MATCH_LIST()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iSortId;								// 列表ID
	int				iID;									// ID
	long long		lUserID;								// 用户ID
	char			szNickName[USER_NAME_LEN];				// 用户呢称
	int				iRankingCode;							// 排名编码
	int				iRankingNo;								// 排名
	int				iGameCoin;								// 鱼币
	int				iRewardGold;							// 奖励金币
	int				iIsGet;									// 是否已经领取
};

// 领取功勋奖励
struct CMD_CS_UPD_FEATS_RANKING_REWARD
{
	CMD_CS_UPD_FEATS_RANKING_REWARD()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iSortId;								// 列表ID
	int				iID;									// ID
	long long		lUserID;								// 用户ID
	int				iRankingNo;								// 排名
};

// 领取比赛奖励
struct CMD_CS_UPD_MATCH_RANKING_REWARD
{
	CMD_CS_UPD_MATCH_RANKING_REWARD()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iSortId;								// 列表ID
	int				iID;									// ID
	long long		lUserID;								// 用户ID
	int				iRankingNo;								// 排名
};

// 领取功勋奖励成功
struct CMD_SC_UPD_FEATS_RANKING_SUC
{
	CMD_SC_UPD_FEATS_RANKING_SUC()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iID;									// ID
	long long		lUserID;								// 用户ID
	int				iRewardGold;							// 奖励金币
};

// 领取比赛奖励成功
struct CMD_SC_UPD_MATCH_RANKING_SUC
{
	CMD_SC_UPD_MATCH_RANKING_SUC()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iID;									// ID
	long long		lUserID;								// 用户ID
	int				iRewardGold;							// 奖励金币
};

// 领取功勋奖励失败
struct CMD_SC_UPD_FEATS_RANKING_ERR
{
	CMD_SC_UPD_FEATS_RANKING_ERR()
	{
		memset(this, 0, sizeof(*this));
	}
	long long		lUserID;								// 用户ID
	int				iRet;									// 失败原因
};

// 领取比赛奖励失败
struct CMD_SC_UPD_MATCH_RANKING_ERR
{
	CMD_SC_UPD_MATCH_RANKING_ERR()
	{
		memset(this, 0, sizeof(*this));
	}
	long long		lUserID;								// 用户ID
	int				iRet;									// 失败原因
};

// 用户注册
struct CMD_CS_UserRegister
{
	CMD_CS_UserRegister()
	{
		memset(this,0,sizeof(*this));
	}
	int			iVersion;								// 版本号
	int			iAppId;									// 游戏AppID(捕鱼=1; 三公=2; 估计牛牛是=5;)
	int			iPlatformNo;							// 1=手机;2=PC;3=网页;
	int			iEnterMode;								// 进入方式(0:用户名密码进入[正常输入用户名密码登录]，1:快速进入[游客登录])
	char		szMachineCode[MACHINE_CODE_LEN];		// 机器序列号
	char		szName[USER_NAME_LEN];					// 帐号
	char		szPwd[USER_PASSWORD_LEN];				// 密码
	char		szNickName[USER_NAME_LEN];				// 昵称
	char		szIp[IP_ADDRES_LEN];					// IP地址(服务器用)
	int			iSex;									// 性别
	int			iTrenchId;								// 渠道【推广公司：比如腾讯，360，安桌市场等等】(0:本公司; )渠道增加把注释也加上。
	char        szAgentCode[USER_NAME_LEN];				// 推荐人编码
	char        szCellPhone[STR_20_LEN];                // 手机电话
	int         iRecommendCode;                        // 推荐号
};

// 用户注册状态
struct CMD_CS_UserRegisterRet
{
	CMD_CS_UserRegisterRet()
	{
		memset(this,0,sizeof(*this));
	}
	int				iRet;								// 返回值
	char			szName[USER_NAME_LEN];				// 帐号
	char			szPwd[USER_PASSWORD_LEN];			// 密码
};

// 获取房间列表
struct CMD_CS_RequestRoomList
{
	CMD_CS_RequestRoomList()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iGameID;							// 游戏ID(比如：1捕鱼; 2斗地主; 3麻将...)
};

// 房间列表
struct CMD_SC_RoomList
{
	CMD_SC_RoomList()
	{
		memset(this, 0, sizeof(*this));
	}
	long long		lParentId;							// 父节点（关卡 1:初级场;2:中级场....）..
	int				iGameID;							// 游戏ID(比如：1捕鱼; 2斗地主; 3麻将...)
	int				iRoomType;							// 游戏类型(1=积分房间、2=金币游戏、3=比赛游戏)..
	int				iRoomId;							// 房间ID
	long long		lRoomTeltComIp;						// 房间的中国电信IP
	long long 		lRoomUnicomIp;						// 房间的中国联通IP
	long long		lRoomMobileIp;						// 房间的中国移动IP
	int				iRoomPort;							// 房间端口
	char			szRoomName[ROOM_NAME_LEN];			// 房间名字
	bool			bAutoSit;							// 是否自动入座(0:不自动，需要手动点坐桌和椅子进入; 1:自动入座，不需要点击椅子号)
	int				iBasePoint;							// 倍率..
	int				iDoorsill;							// 进入门槛(自身金币少于门槛不能进入房间)..
	long long		lMaxDoorsill;						// 最高进入门槛(自身金币少于门槛不能进入房间)..
	int				iTables;							// 房内桌子的数量
	int				iSeatNum;							// 每桌人数，即每桌的座位数量
	int				iEnterTradeGold;					// 报名费(金币)
	int				iEnterTradePoint;					// 报名费(积分)
	int				iRewardGold1;						// 第一名奖励
	int				iRewardGold2;						// 第二名奖励
	int				iPlayerCount;						// 游戏人数
	int				iApplyBankerMinGold;				// 最小上庄金币
	int				iMostToLostMoney;					// 房间最大输钱数
	int				iParm17;							// 庄家本身最少有【x%】金币，才能限制下注，
	int				iParm22;							// 下庄上限【庄家低于x值，系统会自动踢庄家下庄】
	int				iParm23;							// 否是有倍率的房间:(0:没有高倍率,全是1倍. 1:有倍率, 三公是3倍..)
	int				iRevenueRate;						// 房间收税比率
	int             iMaxBetLimit;                       //下注最大限宏    
};

// 登录服内部配置
struct CMD_INNER_LoginConfig
{
	CMD_INNER_LoginConfig()
	{
		memset(this, 0, sizeof(*this));
	}
	int				iListenPort;						// 监听端口
	int				iDbPort;							// 数据库端口
	char			szDbIp[IP_ADDRES_LEN];				// 数据库地址
	char			szDbUserName[DB_USER_NAME_LEN];		// 数据库用户名
	char			szDbUserPwd[DB_PASS_LEN];			// 数据库密码
	char			szDbName[DB_NAME_LEN];				// 数据库名字
	char			szCenterIp[IP_ADDRES_LEN];			// 中心服务器IP地址
	int				iCenterPort;						// 中心服务器端口
};
// add end

// 与官方的联系方式
struct CMD_ContactInformation
{
	CMD_ContactInformation()
	{ 
		memset(this, 0, sizeof(*this)); 
	} 
	char szTelephone[STR_100_LEN]; //电话
	char szCustomerService[STR_100_LEN]; //客服
	char szQQ[STR_100_LEN]; //QQ
	char szWebSite[STR_100_LEN]; //网站
	char szWeChat[STR_100_LEN]; //微信
};

//struct TEST_USER_INFO	// 测试用
//{
//	TEST_USER_INFO(){	memset(this, 0, sizeof(*this));	}
//
//	int		iAge; 
//	char	szName[128];
//};

struct TEST_DB_QUERY
{
	TEST_DB_QUERY(){	memset(this, 0, sizeof(*this));	}

	int		iQueryType;		// 查询的类型
	char	szContent[64];	// 内容
};

// 桌子信息
struct CMD_TableInfo_Test
{
	CMD_TableInfo_Test()
	{
		memset(this, 0, sizeof(*this));
		iTableNo = INVAL_TABLE_NO;
	}

	int iTableNo;

	#if 1
		char szTablePwd[TABLE_PASSWORD_LEN];	// 桌子密码，是四字节对齐的，没有问题
	#else
		char szTablePwd[13];	// 桌子密码，故意不让结构四字节对齐，bFriendEnter 为 int 一切正常，但 bFriendEnter 为 bool 时就有问题
								//           若将 szTablePwd 的长度改成 11 ，是Ok的，一点问题也没有，估计是 11 + 1（bFriendEnter的长度）=12 是4的整数倍，所以没问题；
	#endif

	long long	lCreateTableUserId;			// 创建桌子用户

	bool	bFriendEnter;	// 通常服务端批量发送200个消息，客户端就会出现2000或9000标识的错误，批量发送60个消息也会偶尔出错；
							// 2000或9000标识的错误表示消息乱啦
};

//获取维护人员账号，目的是在服务器在维护状态的时候，用维护人员账号，可以正常进入
//以便测试升级等功能.
struct USER_INFO_MaintenanceStaffInfo
{
	USER_INFO_MaintenanceStaffInfo()
	{
		memset(this, 0, sizeof(*this));
		lUserId = INVALID_USER_ID; 
		lChannelNo = INVALID_CHANNEL_NO;
	}

	long long	lUserId;		 // 用户ID
	long long lChannelNo;        // 玩家通道id
};
#ifdef WIN32
#pragma pack(pop)
#else
#pragma pack()
#endif
#endif
